package com.cdatos.golGana.dao.base;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.cdatos.golGana.model.base.PersistentEntity;

public abstract class AbstractJPADAO<T extends PersistentEntity> implements IGenericDao<T,Long> {

	@PersistenceContext 
	private EntityManager em;

	/**
	 * Obtiene la clase a ser administrada por el DAO.
	 * La clase debe extender de {@link PersistentEntity}.
	 * @return clase del objeto de negocio a ser administrado por el DAO.
	 */
	protected abstract Class<T> getPersistedClass();

	
	public void delete(T obj) throws Exception {
		em.remove(obj);
	}

	@SuppressWarnings("unchecked")
	public List<T> findAll() throws Exception {
		Query query = em.createQuery("from "+ getPersistedClass().getSimpleName());
		return query.getResultList();
	}

	public T findById(Long id) throws Exception {
		return em.find(getPersistedClass(), id);
	}

	public void insert(T obj) throws Exception {
		em.persist(obj);
		em.flush();
	}

	public void update(T obj) throws Exception {
		em.persist(obj);
		em.flush();
	}

	public void setEm(EntityManager em) {
		this.em = em;
	}
	
	public EntityManager getEm(){
		return this.em;
	}
}
